import os
import sys
import shutil
import warnings

'''os_option系统操作类'''


class Os_Option():
    """
    关于系统的相关操作类\n
    1、获取当前路径\n
    2、判断是否存在\n
    3、创建文件夹\n
    4、删除文件夹\n
    5、删除文件\n
    6、移动文件或文件夹\n
    7、重命名文件或文件夹\n
    8、列出文件夹内容\n
    9、切换文件夹\n
    10、判断是否为指定类型\n
    11、获取路径的文件名和扩展名\n
    12、拼接路径\n
    13、获取文件大小\n
    14、获取当前的运行文件名\n
    """

    def __init__(self):
        pass

    def get_current_path(self):
        """
        获取当前的路径
        :return: 返回路径信息
        """
        return os.getcwd()

    def get_isexist(self, path: str = ""):
        """
        判断是否指定路径是否存在
        :param path:路径
        :return:布尔值
        """
        if path == "":
            path = self.get_current_path()
        return os.path.exists(path)

    def make_file_folder(self, path: str):
        """
        创建文件夹
        :param path: 文件夹路径
        :return: 是否创建成功
        """
        os.makedirs(path, exist_ok=True)
        return True

    def delete_file_folder(self, path: str):
        """
        删除文件夹
        :param path:文件夹路径
        :return:是否删除成功
        """
        try:
            shutil.rmtree(path)
            return True
        except Exception as e:
            print(f"删除文件夹{path}失败，详情查看：{e}")
            return False

    def delete_files(self, *file_paths):
        """
        删除指定或多个文件
        :param file_paths: 文件路径列表
        :return: 成功删除的文件数量，失败的文件名列表
        """
        count = 0
        fail_path = []
        for file_path in file_paths:
            if self.is_type(file_path, 1):
                try:
                    os.remove(file_path)
                    count += 1
                except Exception as e:
                    print(f"删除文件 {file_path} 失败，详情查看：{e}")
                    fail_path.append(file_path)
            else:
                fail_path.append(file_path)
        return count, fail_path

    def move_file(self, source_path, destination_path):
        """
        移动文件
        :param source_path: 源文件路径
        :param destination_path: 目标文件路径
        :return: 移动成功返回 True，否则返回 False
        """
        try:
            shutil.move(source_path, destination_path)
            return True
        except Exception as e:
            print(f"移动文件失败，详情查看：{e}")
            return False

    def copy_file(self, source_path, destination_path):
        """
        复制文件
        :param source_path: 源文件路径
        :param destination_path: 目标文件路径
        :return: 复制成功返回 True，否则返回 False
        """
        try:
            shutil.copy(source_path, destination_path)
            return True
        except Exception as e:
            print(f"复制文件失败，详情查看：{e}")
            return False

    def rename_file(self, old_path, new_path):
        """
        重命名文件
        :param old_path: 原文件路径
        :param new_path: 新文件路径
        :return: 重命名成功返回 True，否则返回 False
        """
        try:
            os.rename(old_path, new_path)
            return True
        except Exception as e:
            print(f"重命名文件失败，详情查看：{e}")
            return False

    def list_folder_content(self, path: str, mode: int = 0):
        """
        列出文件夹的内容
        :param path: 文件夹路径
        :param mode: 0 只列出文件，1 列出文件夹，2 列出文件夹和文件并分组
        :return: 相应的列表
        """
        if self.get_isexist(path):
            # print(self.get_isexist(path))
            if mode == 0:
                return [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
            elif mode == 1:
                return [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
            else:
                files = [f for f in os.listdir(path) if os.path.isfile(os.path.join(path, f))]
                folders = [d for d in os.listdir(path) if os.path.isdir(os.path.join(path, d))]
                return {'files': files, 'folders': folders}
        else:
            return False

    def change_folder(self, path: str):
        """
        切换至指定文件夹
        :param path: 要切换的文件夹路径
        :return: 切换成功返回 True，否则返回 False
        """
        if self.get_isexist(path) and self.is_type(path):
            os.chdir(path)
            return True
        else:
            print(f"路径 {path} 不存在或不是文件夹")
            return False

    def is_type(self, path: str, mode: int = 0):
        """
        判断是否为指定类型
        :param path: 路径
        :param mode: 0 是判断是否文件夹，1 是判断是否为文件
        :return: 是指定类型返回 True，否则返回 False
        """
        if mode == 0:
            return os.path.isdir(path)
        elif mode == 1:
            return os.path.isfile(path)
        else:
            print("类型判断无效")
            return False

    def get_file_name_and_extension(self, path: str):
        """
        获取指定路径的文件名和扩展名
        :param path: 文件路径
        :return: 文件名和扩展名组成的元组
        """
        file_name, file_extension = os.path.splitext(os.path.basename(path))
        return file_name, file_extension

    def connect_paths(self, *paths):
        """
        拼接路径
        :param paths: 多个路径片段
        :return: 拼接后的路径
        """
        return os.path.join(*paths)

    def get_file_size(self, path):
        """
        获取文件大小
        :param path: 文件路径
        :return: 文件大小（字节数）
        """
        if self.get_isexist(path) and self.is_type(path, 1):
            return os.path.getsize(path)
        else:
            print(f"{path} 不是文件或者不存在")
            return -1

    def get_current_file_name(self):
        '''
        获取当前运行文件名
        :return:返回文件名，后缀
        '''
        script_path = sys.argv[0]
        script_name = os.path.basename(script_path)
        file_name = script_name.split(".")[0]
        suffix = script_name.split(".")[1]
        return file_name, suffix

    # 创建文件
    def make_file(self, path, data, encode='utf-8', mode=0):
        try:
            if mode == 0:
                # 直接写入
                with open(path, 'w', encoding=encode) as file:
                    file.write(data)
            elif mode == 1:
                # 追加写入
                with open(path, 'a', encoding=encode) as file:
                    file.write(data)
            elif mode == 2:
                # 仅在文件不存在时创建并写入
                with open(path, 'x', encoding=encode) as file:
                    file.write(data)
            elif mode == 3:
                # 以二进制写入模式打开文件
                with open(path, 'wb') as file:
                    if isinstance(data, str):
                        data = data.encode(encode)
                    file.write(data)
            elif mode == 4:
                # 以二进制追加模式打开文件
                with open(path, 'ab') as file:
                    if isinstance(data, str):
                        data = data.encode(encode)
                    file.write(data)
            else:
                print(f"不支持的 mode 值: {mode}")
                return False
            return True
        except FileExistsError as e:
            print(f"文件已存在，无法以当前模式创建，详情查看：{e}")
            return False
        except Exception as e:
            print(f"创建或写入文件失败，详情查看：{e}")
            return False


# 忽略所有警告
warnings.filterwarnings("ignore")
